import os
import time
import pdfplumber
import re
from datetime import datetime

def clean_text(text):
    """清理文本，移除多余的空格和换行"""
    # 移除多余的空格
    text = re.sub(r'\s+', ' ', text)
    # 移除多余的空行
    text = re.sub(r'\n\s*\n', '\n\n', text)
    return text.strip()

def pdf_to_markdown(pdf_path, output_path=None):
    """
    将 PDF 文件转换为 Markdown 格式
    
    Args:
        pdf_path: PDF 文件路径
        output_path: 输出 Markdown 文件路径，如果为 None 则使用 PDF 文件名
    
    Returns:
        bool: 转换是否成功
    """
    if not os.path.exists(pdf_path):
        print(f"错误：文件 {pdf_path} 不存在")
        return False
    
    if output_path is None:
        output_path = os.path.splitext(pdf_path)[0] + '.md'
    
    try:
        with pdfplumber.open(pdf_path) as pdf:
            markdown_content = []
            
            for page in pdf.pages:
                # 提取文本
                text = page.extract_text()
                if text:
                    # 清理文本
                    cleaned_text = clean_text(text)
                    markdown_content.append(cleaned_text)
            
            # 将所有内容写入 Markdown 文件
            with open(output_path, 'w', encoding='utf-8') as f:
                f.write('\n\n'.join(markdown_content))
            
            return True
    
    except Exception as e:
        print(f"转换 {pdf_path} 时出现错误：{str(e)}")
        return False

def find_pdf_files(folder_path):
    """
    在指定文件夹中查找所有PDF文件
    
    Args:
        folder_path: 文件夹路径
    
    Returns:
        list: PDF文件路径列表
    """
    pdf_files = []
    
    if not os.path.exists(folder_path):
        print(f"错误：文件夹 {folder_path} 不存在")
        return pdf_files
    
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.lower().endswith('.pdf'):
                pdf_files.append(os.path.join(root, file))
    
    return pdf_files

def batch_convert_pdfs(folder_path, output_folder=None):
    """
    批量转换文件夹中的所有PDF文件为Markdown格式
    
    Args:
        folder_path: 包含PDF文件的文件夹路径
        output_folder: 输出文件夹路径，如果为None则在原文件夹中生成
    
    Returns:
        dict: 包含转换统计信息的字典
    """
    print(f"开始扫描文件夹：{folder_path}")
    
    # 查找所有PDF文件
    pdf_files = find_pdf_files(folder_path)
    
    if not pdf_files:
        print("未找到任何PDF文件")
        return {'total': 0, 'success': 0, 'failed': 0, 'time_taken': 0}
    
    print(f"找到 {len(pdf_files)} 个PDF文件")
    print("="*50)
    
    # 记录开始时间
    start_time = time.time()
    
    success_count = 0
    failed_count = 0
    failed_files = []
    
    for i, pdf_path in enumerate(pdf_files, 1):
        print(f"[{i}/{len(pdf_files)}] 正在转换：{os.path.basename(pdf_path)}")
        
        # 确定输出路径
        if output_folder:
            # 如果指定了输出文件夹，保持相对路径结构
            rel_path = os.path.relpath(pdf_path, folder_path)
            output_path = os.path.join(output_folder, os.path.splitext(rel_path)[0] + '.md')
            
            # 确保输出目录存在
            os.makedirs(os.path.dirname(output_path), exist_ok=True)
        else:
            # 在原文件夹中生成
            output_path = os.path.splitext(pdf_path)[0] + '.md'
        
        # 转换文件
        file_start_time = time.time()
        if pdf_to_markdown(pdf_path, output_path):
            file_time = time.time() - file_start_time
            print(f"  ✓ 转换成功 ({file_time:.2f}秒) -> {output_path}")
            success_count += 1
        else:
            print(f"  ✗ 转换失败")
            failed_count += 1
            failed_files.append(pdf_path)
        
        print()
    
    # 计算总时间
    total_time = time.time() - start_time
    
    # 输出统计信息
    print("="*50)
    print("转换完成！")
    print(f"总文件数：{len(pdf_files)}")
    print(f"成功转换：{success_count}")
    print(f"转换失败：{failed_count}")
    print(f"总耗时：{total_time:.2f}秒 ({total_time/60:.2f}分钟)")
    print(f"平均每个文件：{total_time/len(pdf_files):.2f}秒")
    
    if failed_files:
        print("\n失败的文件：")
        for failed_file in failed_files:
            print(f"  - {failed_file}")
    
    return {
        'total': len(pdf_files),
        'success': success_count,
        'failed': failed_count,
        'time_taken': total_time,
        'failed_files': failed_files
    }

def main():
    """
    主函数
    """
    # 指定要处理的文件夹路径
    folder_path = r"C:\Users\ajunfornet\Desktop\PubMed_556"
    
    # 可选：指定输出文件夹（如果不指定，则在原文件夹中生成markdown文件）
    # output_folder = r"C:\Users\ajunfornet\Desktop\PubMed_556_markdown"
    output_folder = None
    
    print(f"批量PDF转Markdown工具")
    print(f"处理时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print(f"目标文件夹：{folder_path}")
    print()
    
    # 执行批量转换
    result = batch_convert_pdfs(folder_path, output_folder)
    
    # 保存转换日志
    log_file = os.path.join(os.path.dirname(__file__), 'pdf_conversion_log.txt')
    with open(log_file, 'w', encoding='utf-8') as f:
        f.write(f"PDF批量转换日志\n")
        f.write(f"处理时间：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
        f.write(f"目标文件夹：{folder_path}\n")
        f.write(f"总文件数：{result['total']}\n")
        f.write(f"成功转换：{result['success']}\n")
        f.write(f"转换失败：{result['failed']}\n")
        f.write(f"总耗时：{result['time_taken']:.2f}秒\n")
        if result['failed_files']:
            f.write("\n失败的文件：\n")
            for failed_file in result['failed_files']:
                f.write(f"  - {failed_file}\n")
    
    print(f"\n转换日志已保存至：{log_file}")

if __name__ == "__main__":
    main()